﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using System.IO;

namespace Test2
{
    class Utilizator
    {
        private List<string> permisiuni;
        static private AccesBazaDeDate abd;

        private Utilizator(List<string> permisiuni)
        {
            this.permisiuni = permisiuni;
        }

        //Modul de logare.
        static public Utilizator autentificaUtilizator(string nume, string parola)
        {
            abd = new AccesBazaDeDate();

            string sql = @"SELECT permisiune
                          FROM Permisiuni
                          JOIN Utilizatori_Permisiuni
                            ON Utilizatori_Permisiuni.id_perm = Permisiuni.id_permisiune
                          JOIN Utilizatori_
                            ON Utilizatori_.id_utilizator = Utilizatori_Permisiuni.id_utilizator
                         WHERE Utilizatori_.nume_utilizator=@nume AND Utilizatori_.parola=@parola";
            
            SqlParameter[] pars=new SqlParameter[2];
            pars[0] = new SqlParameter();
            pars[0].ParameterName="@nume";
            pars[0].Value=nume;

            pars[1]=new SqlParameter();
            pars[1].ParameterName="@parola";
            pars[1].Value=parola;

            List<string> perm=abd.autentificaUtilizator(sql,pars);
            Utilizator utilizator = new Utilizator(perm);
            return utilizator;
        }

        public void creeazaUtilizator(string nume, string parola)
        {
            string sql = "INSERT INTO Utilizatori_ (nume_utilizator,parola) values(@nume,@parola)";
            SqlParameter PrNume = new SqlParameter();
            PrNume.Value = nume;
            PrNume.ParameterName = "@nume";

            SqlParameter PrParola = new SqlParameter();
            PrParola.Value = nume;
            PrParola.ParameterName = "@parola";

            Utilizator.abd.creeazaUtilizator(sql,PrNume,PrParola);
        }

        public void stergeUtilizator(string nume)
        {
            string sql =
                "DELETE FROM Utilizatori_ WHERE nume_utilizator=@nume";
            SqlParameter pr = new SqlParameter();
            pr.Value = nume;
            pr.ParameterName = "@nume";

            Utilizator.abd.stergeUtilizator(sql, pr);
        }

        //public bool schimbaCredentiale(string numeVechi, string parolaVeche, string numeNou, string parolaNoua);

        //public bool configureazaConexiune(string sirDeConectare);

        //Modulul produs.
        public void adaugaProdus(string[] detaliiProdus)
        {
            byte[] photo = GetPhoto(detaliiProdus[6]);

            string sql=
                "INSERT INTO Produse (nume_produs,brand_id,stoc,descriere_client,descriere_continut,id_parinte,poza)"
                + "VALUES (@nume_produs,@brand_id,@stoc,@descriere_client,@descriere_continut,@id_parinte,@poza)";
            string[] vars=
            {
                "@nume_produs","@brand_id","@stoc","@descriere_client","@descriere_continut","@id_parinte","@poza"
            };
            SqlParameter[] pars=new SqlParameter[7];
            for (int j = 0; j < 7; j++)
                pars[j]= new SqlParameter();
            int i=0;
            foreach (var p in pars)
            {
                p.ParameterName=vars[i];
                p.Value = detaliiProdus[i];
                i++;
            }
            pars[6].ParameterName = "@poza";
            pars[6].Value = photo;
            pars[6].SqlDbType = SqlDbType.Image;

            Utilizator.abd.adaugaProdus(sql, pars);
        }

        public static byte[] GetPhoto(string filePath)
        {
            FileStream stream = new FileStream(
                filePath, FileMode.Open, FileAccess.Read);
            BinaryReader reader = new BinaryReader(stream);

            byte[] photo = reader.ReadBytes((int)stream.Length);

            reader.Close();
            stream.Close();

            return photo;
        }

        public void salveazaProdusEditat(string[] detaliiProdus)
        {
            string queryProdus = "produsEditat";
            string[] vars =
            {
                "@nume_vechi","@nume_produs","@brand_id","@stoc","@descriere_client","@descriere_continut","@id_parinte"
            };
            SqlParameter[] parametriUpdate = new SqlParameter[7];
            for (int j = 0; j < 7; j++)
                parametriUpdate[j] = new SqlParameter();
            int i = 0;
            foreach (var p in parametriUpdate)
            {
                p.ParameterName = vars[i];
                p.Value = detaliiProdus[i++];
            }

            Utilizator.abd.salveazaProdusEditat(queryProdus,parametriUpdate);

        }

        public bool produsExistentInBazaDeDate(string numeProdus)
        {
            string queryProdusExistent = "SELECT * FROM Produse WHERE nume_produs=@nume_produs";
            SqlParameter par = new SqlParameter();
            par.TypeName = "@nume_produs";
            par.Value = numeProdus;

            return Utilizator.abd.produsExistentInBazaDeDate(queryProdusExistent, par);
        }

        public void stergeTemporarProdusul(string numeProdus)
        {
            string proceduraStergereTemp = "ST";
            SqlParameter par = new SqlParameter();
            par.ParameterName = "@nume_produs";
            par.Value = numeProdus;

            Utilizator.abd.stergeTemporarProdusul(proceduraStergereTemp,par);
        }

        public void stergeDefinitivProdusul(string numeProdus)
        {
            string procStoc_Stergere = "sdpp";
            SqlParameter par = new SqlParameter();
            par.ParameterName = "@nume_produs";
            par.Value = numeProdus;

            Utilizator.abd.stergeDefinitivProdusul(procStoc_Stergere, par);
        }

        public string cautaProdus(string numeProdus)
        {
            string procStoc = "CautaProdus";
            SqlParameter par = new SqlParameter();
            par.ParameterName = "@nume_produs";
            par.Value = numeProdus;

            return Utilizator.abd.cautaProdus(procStoc, par);
        }

        public List<string> toateProduseleExistente()
        {
            //string query = "SELECT * FROM Produse";
            string procStoc = "toateProdusele";
            return Utilizator.abd.toateProduseleExistente(procStoc);
        }

        public DataTable produseFiltrate(string filtru)
        {
            string query = "SELECT * FROM Produse";   
            return Utilizator.abd.produseFiltrate(query,filtru);
        }

        public DataTable produseSortate(string criteriuSortare)
        {
            string query = "SELECT * FROM Produse";
            return Utilizator.abd.produseSortate(query,criteriuSortare);
        }

        public void daPoza(string numeProdus)
        {
            string sql = "SELECT nume_produs,poza FROM Produse WHERE nume_produs=@nume_produs";
            SqlParameter par = new SqlParameter();
            par.Value = numeProdus;
            par.ParameterName = "@nume_produs";

            Utilizator.abd.daPozaProdus(sql, par);
        }

        //public void salveazaImagine()
        //{
        //    try
        //    {
        //        this.sqlConnection1.Open();
        //        if (sqlCommand1.Parameters.Count ==0 )
        //        {
        //            this.sqlCommand1.CommandText="INSERT INTO tblImgData(ID," + 
        //                           " Name,Picture) values(@ID,@Name,@Picture)";
        //            this.sqlCommand1.Parameters.Add("@ID", 
        //                             System.Data.SqlDbType.Int,4);
        //            this.sqlCommand1.Parameters.Add("@Name", 
        //                             System.Data.SqlDbType.VarChar,50);
        //            this.sqlCommand1.Parameters.Add("@Picture", 
        //                             System.Data.SqlDbType.Image);
        //        }

        //        this.sqlCommand1.Parameters["@ID"].Value=this.editID.Text;
        //        this.sqlCommand1.Parameters["@Name"].Value=this.editName.Text;
        //        this.sqlCommand1.Parameters["@Picture"].Value=this.m_barrImg;

        //        int iresult=this.sqlCommand1.ExecuteNonQuery();
        //        MessageBox.Show(Convert.ToString(iresult));
        //    }
        //    catch(Exception ex)
        //    {
        //        MessageBox.Show(ex.Message);
        //    }
        //    finally
        //    {
        //        this.sqlConnection1.Close();
        //    }
        //}

        //public void daImagine()
        //{
        //    try
        //    {
        //        SqlCommand cmdSelect = new SqlCommand("select Picture" +
        //              " from tblImgData where ID=@ID", this.sqlConnection1);
        //        cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
        //        cmdSelect.Parameters["@ID"].Value = this.editID.Text;

        //        this.sqlConnection1.Open();
        //        byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
        //        string strfn = Convert.ToString(DateTime.Now.ToFileTime());
        //        FileStream fs = new FileStream(strfn,
        //                          FileMode.CreateNew, FileAccess.Write);
        //        fs.Write(barrImg, 0, barrImg.Length);
        //        fs.Flush();
        //        fs.Close();
        //        pictureBox1.Image = Image.FromFile(strfn);
        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show(ex.Message);
        //    }
        //    finally
        //    {
        //        this.sqlConnection1.Close();
        //    }
        //}

        public void realizeazaBackup()
        {

        }

        public void restaureazaBazaDeDate()
        {

        }
    }
}
